package memcache

import "code.google.com/p/appengine-go/appengine/memcache"

memcache包提供了App Engine的分布式内存键值对模式的对小块任意数据的存储服务。

基本操作是获取和设定item,键为字符串:

item0, err := memcache.Get(c, "key")
if err != nil && err != memcache.ErrCacheMiss {
	return err
}
if err == nil {
	fmt.Fprintf(w, "memcache hit: Key=%q Val=[% x]\n", item0.Key, item0.Value)
} else {
	fmt.Fprintf(w, "memcache miss\n")
}

和:

item1 := &memcache.Item{
	Key:   "foo",
	Value: []byte("bar"),
}
if err := memcache.Set(c, item1); err != nil {
	return err
}

Index

Variables

var (
    // 表示因item不存在而操作失败
    ErrCacheMiss = errors.New("memcache: cache miss")
    // 表示CompareAndSwap调用因为在Get和CompareAndSwap调用之间修改了缓存值而失败
    // 如果缓存值是被删除而不是替换,将返回ErrNotStored
    ErrCASConflict = errors.New("memcache: compare-and-swap conflict")
    // 表示没有可用的统计信息
    ErrNoStats = errors.New("memcache: no statistics available")
    // 表示某个有条件的写操作(如Add 或 CompareAndSwap)因为条件不满足而失败
    ErrNotStored = errors.New("memcache: item not stored")
    // 表示出现了服务端错误
    ErrServerError = errors.New("memcache: server error")
)
var (
    // 使用gob包的编解码器
    Gob = Codec{gobMarshal, gobUnmarshal}
    // 使用json包的编解码器
    JSON = Codec{json.Marshal, json.Unmarshal}
)

type Statistics

type Statistics struct {
    Hits     uint64 // 缓存命中计数器
    Misses   uint64 // 缓存遗漏计数器
    ByteHits uint64 // 获取转移计数器
    Items uint64 // 当前缓存中的Item的数量
    Bytes uint64 // 当前缓存中的所有Item的大小
    Oldest int64 // 最老Item的存在时间,以秒为单位
}

Statistics代表一个memcache缓存的统计数据集。

func Stats

func Stats(c appengine.Context) (*Statistics, error)

Stats获取当前memcache缓存的统计数据。

type Item

type Item struct {
    // Key是Item的键(最大250字节)。
    Key string
    // Value是Item的值。
    Value []byte
    // Object是Item的值,用于Codec。
    Object interface{}
    // Flags是用于服务端的不透明操作项,其意义完全取决于App Engine服务。
    Flags uint32
    // Expiration是该Item的最大缓存时间,零值表示无过期时间,小于1秒的精度被忽略。
    // 获取Item时不设置该项。
    Expiration time.Duration
    // 内含隐藏或非导出字段
}

Item是memcache存取的基本单元。

func Get

func Get(c appengine.Context, key string) (*Item, error)

使用给定的键获取对应的Item,当item不存在时返回ErrCacheMiss,key最长250字节。

func GetMulti

func GetMulti(c appengine.Context, key []string) (map[string]*Item, error)

Get的批处理版本。返回字典可能会因为缓存中没有对应item而导致键值对数比key的数目少。

func Set

func Set(c appengine.Context, item *Item) error

无条件的写入给定的Item。

func SetMulti

func SetMulti(c appengine.Context, item []*Item) error

Set的批处理版本,可能返回appengine.MultiError类型的错误。

func Add

func Add(c appengine.Context, item *Item) error

如果item的键没有存在对应的item,则写入该item,否则返回ErrNotStored。

func AddMulti

func AddMulti(c appengine.Context, item []*Item) error

Add的批处理版本,可能返回appengine.MultiError类型的错误。

func Delete

func Delete(c appengine.Context, key string) error

删除key对应的Item,如果未找到该Item返回ErrCacheMiss。

func DeleteMulti

func DeleteMulti(c appengine.Context, key []string) error

Delete的批处理版本。

func CompareAndSwap

func CompareAndSwap(c appengine.Context, item *Item) error

函数修改Get函数之前返回的Item,Item的键不可改变,但其它字段都可以修改。在本次CompareAndSwap和Get之间,如果有其它对该Item的修改被写入缓存,会返回ErrCASConflict错误;如果两者中间该Item被删除了,会返回ErrNotStored错误。

func CompareAndSwapMulti

func CompareAndSwapMulti(c appengine.Context, item []*Item) error

CompareAndSwap的批处理版本,可能返回appengine.MultiError类型的错误。

func Flush

func Flush(c appengine.Context) error

清空缓存中的所有Item。

func Increment

func Increment(c appengine.Context, key string, delta int64, initialValue uint64) (newValue uint64, err error)

让key表示的十进制value加上delta,并返回新的value。Value应能用int64表示,上溢会截断,下溢则置为0。Delta可以是负数。如果缓存中不存在键key,则会使用initalValue原子性的创建它,在之后才加上delta。

func IncrementExisting

func IncrementExisting(c appengine.Context, key string, delta int64) (newValue uint64, err error)

函数类似Increment但假设key已经存在于缓存中,以便节省工作量。如果没有找到key对应的Item会返回错误。

type Codec

type Codec struct {
    Marshal   func(interface{}) ([]byte, error)
    Unmarshal func([]byte, interface{}) error
}

Codec代表两个对称的实现了编解码器的函数。Item从memcache中恢复或者存入memcache都会使用Codec对值进行序列化和反序列化。Codec提供的所有方法都和包水平的同名方法效果类似。

func (Codec) Get

func (cd Codec) Get(c appengine.Context, key string, v interface{}) (*Item, error)

获取key对应的Item并解码数据填写入v。如果没找到Item会返回ErrCacheMiss错误。

func (Codec) Set

func (cd Codec) Set(c appengine.Context, item *Item) error

无条件的存入Item。

func (Codec) SetMulti

func (cd Codec) SetMulti(c appengine.Context, items []*Item) error

Set的批处理版本,可能返回appengine.MultiError类型的错误。

func (Codec) Add

func (cd Codec) Add(c appengine.Context, item *Item) error

当item的Key字段在缓存中没有对应的值时,存入item;否则返回ErrNotStored错误。

func (Codec) AddMulti

func (cd Codec) AddMulti(c appengine.Context, items []*Item) error

Add的批处理版本,可能返回appengine.MultiError类型的错误。

func (Codec) CompareAndSwap

func (cd Codec) CompareAndSwap(c appengine.Context, item *Item) error

方法修改Get方法之前返回的Item,Item的键不可改变,但其它字段都可以修改。在本次CompareAndSwap和Get之间,如果有其它对该Item的修改被写入缓存,会返回ErrCASConflict错误;如果两者中间该Item被删除了,会返回ErrNotStored错误。

func (Codec) CompareAndSwapMulti

func (cd Codec) CompareAndSwapMulti(c appengine.Context, items []*Item) error

CompareAndSwap的批处理版本,可能返回appengine.MultiError类型的错误。